/* 
 * File:   JServerMaster.h
 * Author: johnneyshi
 *
 * Created on 2013年1月27日, 下午8:16
 */

#ifndef JSERVERMASTER_H
#define	JSERVERMASTER_H
#include "JServer.h"
#include <string>
#include <vector>
#include "JServerWorker.h"
#include "JClient.h"
#include <queue>

//这个相当与从config中读出的内容
struct MasterWorkerAdapter
{
    int readPipe;//父进程端的读
    int writePipe;//父进程端的写
    JClient* pClient;
    JServerWorker* pWorker;
    int portCount;
};



class JServerMaster : public JServer
{
public:
    JServerMaster();
    //JServerMaster(const JServerMaster& orig);
    virtual ~JServerMaster();
    void Init(std::string _configFileName);
    void Start();
    void AddWorker(MasterWorkerAdapter& adapter);
    void ReadConfig(std::string _configFileName);
    virtual void DealEpollFd(int fd);
    //主进程把得到的新的描述符传给子进程
    virtual void DealNewConnfd(int newFd);
    //创建到worker的连接
    friend void* ClientAdapterThread(void*);
    //
    friend void* AdapterThread(void*);
private:
    std::vector<MasterWorkerAdapter> masterWorkerAdapters; 
//    std::vector<int> readPipes;
//    std::vector<int> writePipes;
//    std::vector<JClient*> pClients;
//    std::vector<JServerWorker*> pWorkers;
//    std::vector<int> portCount;
    
    //返回的是在vector中的下标
    int AssignWork();
    /* 根据portCount创建多线程。基本机制是：创建portCount个多线程，连接到worker端，这样每一个进程都有一个
     * 子进程的函数处理体，接受来自父进程传给的描述符
     * 
     */
    void MasterWorkerAdapterMain(int readFd,int writeFd,MasterWorkerAdapter& adapter);
    /*从toMasterConnFd接受到信息，缓存，然后传入toWorkerConnFd中
     * 一个AdapterTransmitMsg相当与一个线程
     */
    void AdapterTransmitMsg(int readPipe, int writePipe, int toMasterConnFd);
    std::queue<int> needDealFds;
    //如果被占用，那么置toWorkerFd = -toWorkerFd
    std::vector<int> toWorkerFds;
};

//这个是传给线程的arg
struct AdapterThreadArg
{
    MasterWorkerAdapter* pAdapter;
    JServerMaster* pMaster;
    int childReadPipe;
    int childWritePipe;
    int port;
};

#endif	/* JSERVERMASTER_H */

